类的声明
在关键字public后面声明,它们是类与外部的接口
,任何外部函数都可以访问公有类型数据和函数。
在关键字private后面声明,只允许本类中的函数访问
,而类外部的任何函数都不能访问。
在关键字protected后面声明,与private类似
,其差别表现在继承与派生时对派生类的影响
不同
内联成员函数
内联函数,编译的时候将代码直接嵌入到调用的地方,从而减少函数调用的开销,从而提高效率
。内联只是对编译器的建议
,实际上即使加了inline也不一定宏展开,比如遇到switch,for语句的时候就往往不会。
类内部实现的函数都是内联函数
。若在类内部实现,inline关键字可加可不加;在类外部实现,需加inline
,如inline void Clock::SetHour(int hour) { }
。
类与结构体
class与struct的区别:在未指定访问权限时,class默认的是私有的,struct默认是公有的
struct Test
{
int X;//公有的
...
};
隐含的this指针
成员函数有一个隐含的附加形参
,即指向该对象的指针,这个隐含的形参叫做this指针,编译器自动传递
使用this指针保证了每个对象可以拥有不同数值的数据成员
,但处理这些成员的代码可以被所有对象共享
成员函数是只读的代码,由所有对象共享,并不占对象的存储空间
,因为this指针指向当前对象,所以成员函数可以区分它所作用的对象是哪一个。
class A
{
public:
int m;
void print()
{
cout << "A" << endl;
}
};
A *pa = 0;
pa->print();
相当于成员函数传递的this指针为0,那调用会出错吗? 肯定是正确输出”A” 的,因为this为0表示没有对某个对象进行操作,而print里面确实没有对某
个对象成员进行操作
,所以是可以运行的。
前向声明
C++中类必须先定义,才能够实例化
。两个类需要相互引用头文件
形成一个“环形”引用时会出错。这时候需要用到前向声明
,前向声明的类不能实例,但可以定义指针或引用
。
#ifndef _B_H_
#define _B_H_
class A;
class B
{
public:
B(void);
~B(void);
void fun(A &a)
{
}
A *a_; // 前向声明的类不能实例化对象
};
#endif // _B_H_
#ifndef _A_H_
#define _A_H_
#include "B.h"
class A
{
public:
A(void);
~A(void);
B b_;
};
#endif // _A_H_
嵌套类\局部类
嵌套类
外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现
。
从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外
的作用域使用该类名时,需要加名字限定
。
嵌套类中的成员函数可以在它的类体外定义
。
嵌套类仅仅只是语法上的嵌入
。嵌套类的成员函数对外围类的私有成员没有访问权
,反之亦然。
#include <iostream>
using namespace std;
class Outer
{
public:
class Inner
{
public:
void Fun();
//{
// cout<<"Inner::Fun ..."<<endl;
//}
};
public:
Inner obj_;
void Fun()
{
cout << "Outer::Fun ..." << endl;
obj_.Fun();
}
};
void Outer::Inner::Fun()
{
cout << "Inner::Fun ..." << endl;
}
int main(void)
{
Outer o;
o.Fun();
Outer::Inner i;
i.Fun();
}
局部类(基本没用过,稍作了解)
类也可以定义在函数体内
,这样的类被称为局部类。局部类只在定义它的局部域内可见。